package pl.edu.pk.psb.controller;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSession;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.context.ServletContextAware;
import org.springframework.web.servlet.ModelAndView;

import pl.edu.pk.psb.assembler.SalaCommandAssembler;
import pl.edu.pk.psb.assembler.WydarzenieCommandAssembler;
import pl.edu.pk.psb.bc.bo.WydarzenieBo;
import pl.edu.pk.psb.bc.dto.KategoriaDto;
import pl.edu.pk.psb.bc.dto.WydarzenieDto;
import pl.edu.pk.psb.command.WydarzenieCommand;
import pl.edu.pk.psb.validator.WydarzenieValidator;

@Controller
public class WydarzenieController {

	public static final String SCIEZKA_DO_OBRAZKOW = "http://localhost/psb/images/";

	@Autowired
	WydarzenieCommandAssembler wydarzenieCommandAssembler;

	@Autowired
	WydarzenieBo wydarzenieBo;

	@Autowired
	WydarzenieValidator wydarzenieWalidator;

	@Autowired
	SalaCommandAssembler salaAssembler;

	@ModelAttribute("command")
	public WydarzenieCommand stworzWydarzenieCommand() {

		return new WydarzenieCommand();
	}

	/**
	 * Przekierowuje na formularz nowego wydarzenia
	 * 
	 * @return logiczna nazwa widoku
	 */
	@RequestMapping("/formularzNowegoWydarzenia")
	public ModelAndView przekierujNaNoweWydarzenie() {
		Map<String, Object> model = new HashMap<String, Object>();
		List<KategoriaDto> kategorie = wydarzenieBo.pobierzGlowneKategorie();
		model.put("kategorie", kategorie);
		return new ModelAndView("utworzWydarzenie", model);
	}

	/**
	 * Waliduje formularz dodawania wydarzenia i jesli nie ma przeszkod to je
	 * dodaje
	 * 
	 * @param command
	 *            - Command z danymi z formularza
	 * @param wynik
	 *            - Wynik sprawdzania bledow
	 * @return Widok tworzenia nowego wydarzenia
	 */
	@RequestMapping("/utworzNoweWydarzenie")
	public ModelAndView utworzNoweWydarzenie(
			@ModelAttribute("command") WydarzenieCommand command,
			BindingResult wynik, HttpSession sesja) {
		wydarzenieWalidator.validate(command, wynik);
		if (wynik.hasErrors()) {
			Map<String, Object> model = new HashMap<String, Object>();
			List<KategoriaDto> kategorie = wydarzenieBo
					.pobierzGlowneKategorie();
			model.put("kategorie", kategorie);
			if (command.isCzyJestSala()
					&& StringUtils.isNotBlank(command.getWybraneMiejsca())) {
				// jesli sa bledy to trzeba przetransformowac uklad miejsc z
				// postaci String na liste rzedow do wyswietlenia jako model
				model.put("miejsca",
						salaAssembler.stworzNowaSaleZCommanda(command)
								.getMiejsca());
			}
			return new ModelAndView("utworzWydarzenie", model);
		}
		WydarzenieDto wydarzenie = wydarzenieCommandAssembler
				.konwertuj(command);
		wydarzenie.setDataDodania(new Date());
		wydarzenieBo.zapiszWydarzenie(wydarzenie);
		sesja.setAttribute("wiadomosc", "utworzNoweWydarzenie.potwierdzenie");
		return new ModelAndView("redirect:/glowna");
	}

	/**
	 * Wyswietla widok z podstawowymi informacjami o wydarzeniu
	 * 
	 * @param id
	 *            identyfikator wydarzenia
	 * @return widok wydarzenia
	 */
	@RequestMapping("/pokazWydarzenie")
	public ModelAndView pokazWydarzenie(@RequestParam Integer id) {
		WydarzenieDto wydarzenie = wydarzenieBo.pobierzWydarzenie(id);
		Map<String, Object> model = new HashMap<String, Object>();
//		do zmiany
		String obrazek = wydarzenie.getSciezkaObrazu();
		wydarzenie.setSciezkaObrazu(SCIEZKA_DO_OBRAZKOW + obrazek);
		
		model.put("wydarzenie", wydarzenie);
		return new ModelAndView("pokazWydarzenie", model);
	}

	@RequestMapping("/listaWydarzen")
	public ModelAndView listaWydarzen() {
		List<WydarzenieDto> lista = wydarzenieBo.pobierzWydarzenia();
//		do zmiany
		for(WydarzenieDto l:lista){
			String obrazek = l.getSciezkaObrazu();
			l.setSciezkaObrazu(SCIEZKA_DO_OBRAZKOW + obrazek);
		}
		return new ModelAndView("listaWydarzen", "wydarzenia", lista);
	}
}
